/*
 * @FileName: bsp_flash.h
 * @Author: GreyQiu qiushaogui@aikosolar.com
 * @Date: 2023-07-13 15:53:50
 * @LastEditors: GreyQiu qiushaogui@aikosolar.com
 * @LastEditTime: 2023-09-20 13:29:58
 * @Description: 
 * 本模块实现在芯片flash中模拟eeprom
 * 注意！！ 本模块对上层应用屏蔽了EEPROM在FLASH中的具体位置
 * 用户仅认为eeprom基地址从0开始以及大小即可，无需考FLASH中的实际位置
 * 
 * Copyright (c) 2023, All Rights Reserved. 
 */
#ifndef __BSP_FLASH_H__
#define __BSP_FLASH_H__

#include "n32g430.h"

#define FLASH_BASE_ADDR     (0x08000000)    // 芯片FLASH基址
#define FLASH_PAGE_SIZE     (2048)          // FLASH每个PAGE大小为2KB
#define FLASH_PAGE_NUM      (32)            // FLASH共有32个PAGE
#define FLASH_WORD_SIZE     (4)             // FLASH仅支持4字节编程

#define BOOT_OFFSET   0x0000
#define APP1_OFFSET   0x4000
#define APP2_OFFSET   0xA000

// 保存BOOT的BIN文件信息
#define BOOT_ADDR    (FLASH_BASE_ADDR + BOOT_OFFSET)
#define BOOT_SIZE    (FLASH_PAGE_SIZE * 6) // 大小6个PAGE

// 保存APP的BIN文件信息
#define APP_HEAD_ADDR    (FLASH_BASE_ADDR + 0x3000)
#define APP_HEAD_SIZE    (FLASH_PAGE_SIZE * 1) // 大小1个PAGE

#ifdef NO_BOOT
    #define DEVICE_DATA_ADDR    (FLASH_BASE_ADDR + 0xF800)
    #define DEVICE_DATA_SIZE    (FLASH_PAGE_SIZE * 1) // 大小1个PAGE
#else
    // 保存SN 型号等机器参数，以及校准参数
    #define DEVICE_DATA_ADDR    (FLASH_BASE_ADDR + 0x3800)
    #define DEVICE_DATA_SIZE    (FLASH_PAGE_SIZE * 1) // 大小1个PAGE
#endif

// 保存APP二进制文件
#define APP1_BASE_ADDR    (FLASH_BASE_ADDR + APP1_OFFSET) // flash第6页开始为APP1的地址
#define APP1_PAGE_NUM     (12) // 大小12个PAGE 共24KB
#define APP1_SIZE         (FLASH_PAGE_SIZE * APP1_PAGE_NUM) // 大小12个PAGE 共24KB

// 保存APP二进制文件
#define APP2_BASE_ADDR    (FLASH_BASE_ADDR + APP2_OFFSET) // flash第6页开始为APP1的地址
#define APP2_PAGE_NUM     (12) // 大小12个PAGE 共24KB
#define APP2_SIZE         (FLASH_PAGE_SIZE * APP2_PAGE_NUM) // 大小12个PAGE 共24KB





// 定义FLASH对象，保存基地址，操作范围等信息
typedef struct
{
    uint32_t base_addr;
    uint32_t size;
} flash_obj_t;

ErrorStatus bsp_flash_obj_init(flash_obj_t * obj, uint32_t base_addr, uint32_t size);
ErrorStatus bsp_flash_page_erase(flash_obj_t * obj, uint32_t page_addr, uint32_t page_num);
ErrorStatus bsp_flash_write(flash_obj_t * obj, uint32_t address, uint8_t * pData, uint32_t byteSize);
ErrorStatus bsp_flash_read(flash_obj_t * obj, uint32_t address, uint8_t * pData, uint32_t byteSize);

#endif // __BSP_FLASH_H__
